package logica.interfaces;

import java.util.List;

import logica.exceptions.InvalidDataException;
import logica.exceptions.RequiredDataException;
import logica.exceptions.UserDoesNotContainProductsException;

/**
 * Interface que encapsula o comportamento de um usuario do sistema de leilao
 * virtual.
 *
 *
 */
public interface UserIF {

	/**
	 * Atualiza o login do usuario.
	 *
	 * @param login
	 *            o novo login.
	 */
	public void setLogin(String login) throws RequiredDataException;

	/**
	 * Retorna o login do usuario.
	 *
	 * @return o login do usuario.
	 */
	public String getLogin();

	/**
	 * Atualiza o nome do usuario.
	 *
	 * @param nome
	 *            o novo nome.
	 * @throws Exception
	 *             Se o nome for null ou vazio.
	 */
	public void setName(String nome) throws RequiredDataException;

	/**
	 * Retorna o nome do usuario.
	 *
	 * @return o nome do usuario.
	 */
	public String getName();

	/**
	 * Atualiza o endereco do usuario.
	 *
	 * @param Endereco
	 *            o novo endereco.
	 * @throws Exception
	 *             Se o endereco for null ou vazio.
	 */
	public void setAddress(String address) throws RequiredDataException;

	/**
	 * Retorna o endereco do usuario.
	 *
	 * @return o endereco do usuario.
	 */
	public String getAddress();

	/**
	 * Atualiza o numero de cpf do usuario.
	 *
	 * @param Cpf
	 *            o novo cpf.
	 * @throws Exception
	 *             Se o numero de cpf for null ou vazio.
	 */
	public void setCpfNumber(String cpfNumber) throws InvalidDataException,
			RequiredDataException;

	/**
	 * Retorna o numero de cpf do usuario.
	 *
	 * @return o numero de cpf do usuario.
	 */
	public String getCpfNumber();

	/**
	 * Atualiza o endereco de email do usuario.
	 *
	 * @param email
	 *            o novo endereco de email.
	 * @throws Exception
	 *             Se o endereco for null ou vazio.
	 */
	public void setEmail(String email) throws InvalidDataException,
			RequiredDataException;

	/**
	 * Retorna o enedereco de email do usuario.
	 *
	 * @return o enedereco de email do usuario.
	 */
	public String getEmail();

	/**
	 * Atualiza a senha do usuario.
	 *
	 * @param senha
	 *            a nova senha.
	 */
	public void setPassword(String senha) throws RequiredDataException;

	/**
	 * Retorna a senha do usuario.
	 *
	 * @return a senha do usuario.
	 */
	public String getPassword();

	/**
	 * Atualiza o numero de telefone do usuario.
	 *
	 * @param tel
	 *            o novo numero de telefone.
	 */
	public void setPhoneNumber(String tel) throws RequiredDataException;

	/**
	 * Retorna o numero de telefone do usuario.
	 *
	 * @return o numero de telefone do usuario.
	 */
	public String getPhoneNumber();

	/**
	 * Retorna o status do usuario.
	 *
	 * @return o status do usuario.
	 */
	public int getStatus();

	/**
	 * Adiciona um status ao status de usuario. A media dos status ditam o
	 * status final do usuario.
	 *
	 * @param status
	 *            um numero inteiro indicando o status. (usar os fields da
	 *            interface).
	 * @throws RequiredDataException
	 *             Se o status for nulo.
	 */
	public void addStatus(int status) throws RequiredDataException;

	/**
	 * Retorna o produto de indice index do usuario.
	 *
	 * @param index
	 *            o indice do produto.
	 * @return o produto de indice index.
	 */
	public String listProduct(int index);

	/**
	 * Remove todos os produtos de um usuario.
	 *
	 * @throws UserDoesNotContainProductsException
	 *             Se o usuario nao tiver produtos.
	 */
	public void removeAllProducts() throws UserDoesNotContainProductsException;

	/**
	 * Remove um produto do um usuario.
	 *
	 * @param String
	 *            productId
	 * @throws UserDoesNotContainProductsException
	 */
	public void removeProducts(String productId)
			throws UserDoesNotContainProductsException;

	/**
	 * Adiciona um produto ao usuario.
	 *
	 * @param productId
	 *            O id do produto.
	 */
	public void addProduct(String productId);

	/**
	 * Retorna todos os produtos do usuario.
	 *
	 * @return Todos os produtos do usuario.
	 */
	public List<String> getAllProducts();

	/**
	 * Aumenta o status do usuario.
	 */
	public void setStatusUp();

	/**
	 * Diminui o status do usuario.
	 */
	public void setStatusDown();

	/**
	 * Notifica um usuario que ele venceu o leilao.
	 *
	 * @param auctionName
	 *            Nome do leilao.
	 * @param product
	 *            nome do produto.
	 */
	public void notifyWinnerAuction(String auctionName, String auctionProduct);

}
